//: C04:CppLib.cpp {O}
// C library converted to C++
// Declare structure and functions:
#include "CppLib.h"
#include <iostream>
#include <cassert>
using namespace std;
// Quantity of elements to add 
// when increasing storage:
const int increment = 100;

void Stash::initialize(int size)
{
    size = sz;
    quantity = 0;
    storage = 0;
    next = 0;
}
void Stash::cleanup()
{
    if(storage != 0)
    {
        cout << "freeing storage" << '\n';
        delete []storage;
    }
}
int Stash::add(const void *element)
{
    if(next >= quantity)    // Enough space left?
    {
        inflate(increment);
    }    
    // Copy element into storrage,
    // starting at next empyt space:
    int startBytes = next * size;
    unsigned char *e = (unsigned char*)element;
    for(int i = 0; i < size; i++)
    {
        storage[startBytes + i] = e[i];
    }
    next++;
    return (next - 1);    // Index number
}
void Stash::*fetch(int index)
{
    // Check index boundaries:
    assert(0 <= index);
    if(index >= next)
    {
        return 0;    // To indicate the end
    }
    // Produce pointer to desired element
    return &(storage[index * size]);
}

int Stash::count()
{
    return next; // Number of elements in CStash
}

void Stash::inflate(int increase)
{
    assert(increase > 0);
    int newQuantity = quantity + increase;
    int newBytes = newQuantity * size;
    int oldBytes = quantity * size;
    unsigned char *b = new unsigned char[newBytes];
    for(int i = 0; i < oldBytes; i++)
    {
        b[i] = storage[i];    // Cotpy old to new
    }
    delete []storage;   // Old storage
    storage = b;    // Point to new memory
    quantity = newQuantity;
}

